<?php

/**
 * This is the model class for table "tbl_usuario".
 *
 * The followings are the available columns in table 'tbl_usuario':
 * @property string $usuario_id
 * @property integer $usuario_persona_tipodocumento_id
 * @property string $usuario_persona_numerodocumento
 * @property string $usuario_nombre
 * @property string $usuario_clave
 * @property string $usuario_preguntasecreta
 * @property string $usuario_repuestasecreta
 * @property string $usuario_token
 * @property string $usuario_tokensession
 * @property string $usuario_creado
 * @property string $usuario_creado_usuario_id
 * @property string $usuario_modificado
 * @property string $usuario_modificado_usuario_id
 * @property integer $usuario_estado_id
 *
 * The followings are the available model relations:
 * @property TblDireccion[] $tblDireccions
 * @property TblDireccion[] $tblDireccions1
 * @property TblLocalidad[] $tblLocalidads
 * @property TblLocalidad[] $tblLocalidads1
 * @property TblPais[] $tblPaises
 * @property TblPais[] $tblPaises1
 * @property TblPersona[] $tblPersonas
 * @property TblPersona[] $tblPersonas1
 * @property TblProvincia[] $tblProvincias
 * @property TblProvincia[] $tblProvincias1
 * @property TblPersona $usuarioPersonaTipodocumento
 */
class Usuario extends MyCActiveRecord
{
	public $usuario_old_clave;
	public $usuario_re_clave;
	
	public $usuario_persona_apellido;
	public $usuario_persona_nombres;
	public $usuario_tipodocumento_abreviacion;
	
	public $usuario_rol_nombre;
	/**
	 * Returns the static model of the specified AR class.
	 * @return Usuario the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'tbl_usuario';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('usuario_nombre, usuario_preguntasecreta, usuario_repuestasecreta, usuario_token, usuario_estado_id, usuario_persona_tipodocumento_id, usuario_persona_numerodocumento', 'required'),
			
			array('usuario_persona_tipodocumento_id, usuario_estado_id', 'numerical', 'integerOnly'=>true),
			array('usuario_persona_numerodocumento, usuario_nombre', 'length', 'max'=>50),
			array('usuario_preguntasecreta, usuario_repuestasecreta, usuario_clave', 'length', 'max'=>200),
			array('usuario_token, usuario_tokensession', 'length', 'max'=>255),
			array('usuario_creado_usuario_id, usuario_modificado_usuario_id', 'length', 'max'=>20),
			array('usuario_modificado,usuario_re_clave,usuario_old_clave', 'safe'),
			array('usuario_clave,usuario_re_clave','required','on'=>'insert'),
			array('usuario_clave','validarClaves','on'=>array('createUpdate','ChangePassword')),
			
			
			array('usuario_nombre', 'unique'),
			
			array('usuario_persona_apellido, usuario_persona_nombres', 'length', 'max'=>50),
			
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('usuario_id,usuario_persona_apellido,usuario_persona_nombres,usuario_persona_numerodocumento, usuario_tipodocumento_abreviacion, usuario_nombre, usuario_estado_id,usuario_rol_nombre', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'usuarioCreador' => array(self::BELONGS_TO, 'Usuario', 'usuario_creado_usuario_id'),
			'usuarioModificador' => array(self::BELONGS_TO, 'Usuario', 'usuario_modificado_usuario_id'),
			'tipoDocumento' => array(self::BELONGS_TO, 'TipoDocumento', 'usuario_persona_tipodocumento_id'),
			'rol' => array(self::HAS_MANY, 'UsuarioRol', 'userid'),
			'persona' => array(
									self::BELONGS_TO, 
									'Persona',
									'usuario_persona_numerodocumento,usuario_persona_tipodocumento_id'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'usuario_id' => t('ID','nucleo_etiqueta'),
			'usuario_persona_tipodocumento_id' => t('Tipo Documento','persona_etiqueta'),
			'usuario_persona_numerodocumento' => t('Numero Documento','persona_etiqueta'),
			'usuario_nombre' => t('Nombre','persona_etiqueta'),
			'usuario_clave' => 'Clave',
			'usuario_preguntasecreta' => 'Pregunta Secreta',
			'usuario_repuestasecreta' => 'Repuesta Secreta',
			'usuario_token' => 'Usuario Token',
			'usuario_tokensession' => 'Usuario Tokensession',
			'usuario_creado' => t('Creado','nucleo_etiqueta'),
			'usuario_creado_usuario_id' => 'Usuario Creado Usuario',
			'usuario_modificado' => t('Modificado','persona_etiqueta'),
			'usuario_modificado_usuario_id' => 'Modificado Usuario',
			'usuario_estado_id' => 'Usuario Estatus',
		
			'usuario_rol_nombre' => t('Rol','persona_etiqueta'),
			
			
			'usuario_persona_apellido' => t('Apellido','persona_etiqueta'),
			'usuario_persona_nombres' => t('Nombres','persona_etiqueta'),
			'usuario_tipodocumento_abreviacion' => 'Tipo de Documento',
			'usuario_re_clave' => t('Repita Clave','persona_etiqueta'),
			
			
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('usuario_id',$this->usuario_id,true);
		$criteria->compare('usuario_persona_tipodocumento_id',$this->usuario_persona_tipodocumento_id);
		$criteria->compare('usuario_persona_numerodocumento',trim($this->usuario_persona_numerodocumento),true);
		$criteria->compare('usuario_nombre',trim($this->usuario_nombre),true);
		$criteria->compare('usuario_clave',$this->usuario_clave,true);
		$criteria->compare('usuario_preguntasecreta',$this->usuario_preguntasecreta,true);
		$criteria->compare('usuario_repuestasecreta',$this->usuario_repuestasecreta,true);
		$criteria->compare('usuario_token',$this->usuario_token,true);
		$criteria->compare('usuario_tokensession',$this->usuario_tokensession,true);
		/*
		$criteria->compare('usuario_creado',$this->usuario_creado,true);
		$criteria->compare('usuario_creado_usuario_id',$this->usuario_creado_usuario_id,true);
		$criteria->compare('usuario_modificado',$this->usuario_modificado,true);
		$criteria->compare('usuario_modificado_usuario_id',$this->usuario_modificado_usuario_id,true);
		*/
		
		$criteria->together  =  true;
		$criteria->with = array('rol','persona');
		$criteria->addCondition("rol.itemname <> '". AplicacionVariables::ROL_ALUMNO ."'" );
		
		$criteria->compare('persona.persona_apellido',$this->usuario_persona_apellido,true);
		$criteria->compare('persona.persona_nombres',$this->usuario_persona_nombres,true);
		$criteria->compare('rol.itemname',$this->usuario_rol_nombre,true);
		
		
		
		
		if(!user()->checkAccess('Persona.Usuario.Create') || !user()->checkAccess('Persona.Usuario.*'))
		{
			$this->usuario_estado_id = AplicacionVariables::ESTADO_ACTIVO_ID;
			$criteria->compare('usuario_estado_id',$this->usuario_estado_id);
		}
		
		if(!user()->isSuperuser)
		{
			$criteria->addCondition('usuario_estado_id <> ' .AplicacionVariables::ESTADO_ELIMINADO_ID); 
			$criteria->addCondition("usuario_nombre <> 'root'");
		}
		
		$sort = array('attributes'=>array(
            								'usuario_persona_apellido'=>array(
                								'asc'=>'persona.persona_apellido',
                								'desc'=>'persona.persona_apellido DESC',
            								),
            								'usuario_persona_nombres'=>array(
                								'asc'=>'persona.persona_nombres',
                								'desc'=>'persona.persona_nombres DESC',
            								),
            								'*',
        								),
        			'defaultOrder'=>array('usuario_persona_apellido'=>false,'usuario_persona_nombres'=>false),
    	);
		

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
			'sort'=>$sort,
		));
	}
	
	public function validarClaves()
	{
		
		if($this->getIsNewRecord()) //nuevo usuario exigo password
		{
			
			if(trim($this->usuario_re_clave) == '' || trim($this->usuario_clave) == '')
			{
				$this->addError('usuario_clave',t('Debe Ingresar clave','persona_etiqueta'));
			}
			
			if($this->usuario_re_clave != $this->usuario_clave)
			{
				$this->addError('usuario_re_clave',t('Las Claves no son iguales','persona_etiqueta'));
			}
			//si llego aca no hay error y encodeo la clave
			if(count($this->getErrors()) == 0)
			{
				$this->usuario_clave = hash('sha512', $this->usuario_clave);
			}
		}
		else //modifica
		{
			
			$originalUser = $this->findByPk($this->usuario_id);
			if(!is_null($originalUser))//existe usuario
			{
				
				if(trim($this->usuario_old_clave) != '') //esta modificando el password
				{
					if($originalUser->usuario_clave != hash('sha512',$this->usuario_old_clave))
					{
						$this->addError('usuario_old_clave',t('Clave Anterior Incorrecta','persona_etiqueta'));
					}
					//var_dump($this->getErrors());
					//echo 'e';exit;
					if(trim($this->usuario_re_clave) == '' || trim($this->usuario_clave) == '')
					{
						$this->addError('usuario_clave',t('Debe Ingresar clave','persona_etiqueta'));
					}
					
					if($this->usuario_re_clave != $this->usuario_clave)
					{
						$this->addError('usuario_re_clave',t('Las Claves no son iguales','persona_etiqueta'));
						
					}
					if(count($this->getErrors()) == 0)
					{
						$this->usuario_clave = hash('sha512', $this->usuario_clave);
					}
				}
				else //dejo la clave como esta
				{
					$this->usuario_clave = $originalUser->usuario_clave;
				}
			}
			else//modifica un usuario que no existe
			{
				$this->addError('usuario_clave',t('El usuario no existe mas','persona_etiqueta'));
			}
			
		}

		
	}
}